/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ecommercer.dao;

import br.com.ecommercer.bean.Endereco;
import br.com.ecommercer.bean.Evento;
import br.com.ecommercer.bean.Ingresso;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

/**
 *
 * @author Petterson
 */
public class IngressoDaoImp implements IngressoDao {

    @Override
    public Object salvar(Object obj) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        Ingresso ingresso = (Ingresso) obj;
        try {
            String SQL = "INSERT INTO ingresso(quantidadeDisponivel,setor,id_evento,id_compra) VALUES(?,?,?,?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, ingresso.getQuantidade());
            ps.setString(2, ingresso.getSetor());
            ps.setInt(3, ingresso.getEnvento().getId());
            ps.setInt(4, ingresso.getCompra().getId());
            ps.executeUpdate();
        } catch (Exception ex) {
            throw new Exception("Erro ao inserir ingresso" + ex.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return ingresso;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        Ingresso ingresso = (Ingresso) obj;
        try {
            String SQL = "UPDATE ingresso SET quantidadeDisponivel = ? , setor = ? WHERE id = ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, ingresso.getQuantidade());
            ps.setString(2, ingresso.getSetor());
            ps.setInt(3, ingresso.getId());
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Erro ao inserir ingresso" + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String SQL = "DELETE FROM ingresso WHERE id = ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Erro ao excluir ingresso" + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }

    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Ingresso ingresso = null;
        Evento evento = null;
        Endereco endereco = null;
        try {
            String SQL = "SELECT * FROM ingresso ing INNER JOIN evento eve "
                    + "ON ing.id_evento = eve.id INNER JOIN endereco end "
                    + "ON eve.id_endereco = end.id WHERE ing.id = ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                ingresso = new Ingresso();
                ingresso.setId(rs.getInt("ing.id"));
                ingresso.setQuantidade(rs.getInt("quantidadeDisponivel"));
                ingresso.setSetor(rs.getString("setor"));
                evento = new Evento();
                evento.setId(rs.getInt("eve.id"));
                evento.setNome(rs.getString("nome"));
                evento.setArtista(rs.getString("artista"));
                evento.setEstilo(rs.getString("estilo"));
                evento.setDescricao(rs.getString("descricao"));
                evento.setDataEvento(rs.getDate("dataEvento"));
                endereco = new Endereco();
                endereco.setId(rs.getInt("end.id"));
                endereco.setLocal(rs.getString("local"));
                endereco.setRua(rs.getString("rua"));
                endereco.setBairro(rs.getString("bairro"));
                endereco.setCidade(rs.getString("cidade"));
                endereco.setEstado(rs.getString("estado"));
                endereco.setCep(rs.getString("cep"));
                endereco.setCapacidadeMaxima(rs.getInt("capacidadeMaxima"));
                evento.setEndereco(endereco);
                ingresso.setEnvento(evento);
            }
        } catch (Exception ex) {
            throw new Exception("Erro ao procurar ingresso" + ex.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return ingresso;
    }

    @Override
    public List<Object> listar() throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Ingresso ingresso = null;
        Evento evento = null;
        Endereco endereco = null;
        List ingressos = null;
        try {
            String SQL = "SELECT * FROM ingresso ing INNER JOIN evento eve "
                    + "ON ing.id_evento = eve.id INNER JOIN endereco end "
                    + "ON eve.id_endereco = end.id";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            while (rs.next()) {
                ingresso = new Ingresso();
                ingresso.setId(rs.getInt("ing.id"));
                ingresso.setQuantidade(rs.getInt("quantidadeDisponivel"));
                ingresso.setSetor(rs.getString("setor"));

                evento = new Evento();
                evento.setId(rs.getInt("eve.id"));
                evento.setNome(rs.getString("nome"));
                evento.setArtista(rs.getString("artista"));
                evento.setEstilo(rs.getString("estilo"));
                evento.setDescricao(rs.getString("descricao"));
                evento.setDataEvento(rs.getDate("dataEvento"));

                endereco = new Endereco();
                endereco.setId(rs.getInt("end.id"));
                endereco.setLocal(rs.getString("local"));
                endereco.setRua(rs.getString("rua"));
                endereco.setBairro(rs.getString("bairro"));
                endereco.setCidade(rs.getString("cidade"));
                endereco.setEstado(rs.getString("estado"));
                endereco.setCep(rs.getString("cep"));
                endereco.setCapacidadeMaxima(rs.getInt("capacidadeMaxima"));

                evento.setEndereco(endereco);
                ingresso.setEnvento(evento);
                ingressos.add(ingresso);
            }
        } catch (Exception e) {
            throw new Exception("Erro ao listar ingresso" + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return ingressos;
    }
}
